前言
在介绍了前面的桌面的3D-Touch,这篇文章来介绍应用中使用peek & pop。 比如QQ 微信中消息界面重压cell就会出现peek & pop。接下来实现这一效果。
实现
创建视图(sourceView)
首先用tableview来做例子。用storyboard创建表,在这里就不赘述了。
1 | var titleArray = ["3D-Touch Objective-C","3D-Touch Swift","前言快报:Swift终将超越OC,进而取代OC","Github9月编程语言 JS 跃居第一位"] |
创建一个数组来做tableview的数据源。
实现代理
在实现这一效果之前,需要使当前的控制器实现UIViewControllerPreviewingDelegate
代理并且要判断当前设备是否支持Peek & pop:
1 | if traitCollection.forceTouchCapability == .available{ |
代理中有两个方法:
1 | public func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? |
第一个参数可以获取到要显示的是哪个目标view(sourceView)以及手势,其中有个属性(sourceRect)还可以控制那块区域展示出peek的效果
第二个参数location 顾名思义就是要控制能产生重压的区域。(与第一个参数的sourceRect不同,sourceRect只是哪片区域要展示peek效果,就是在屏幕中视图凸起的那一部分。如果不设置默认就是整个sourceView,而这个参数则是控制哪些区域能使用peek效果)。注意 “能” 和 “要”。
这个方法返回的是要显示的那个控制器,就是pop预览的那个控制器。
1 | public func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) |
这个方法就是用来做跳转的。
开始实现代理方法
我们需要新建一个控制器来做pop效果,返回出这个控制器。
1 | func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { |
1 | func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) { |
show 和 push都能展示出相同的效果
在显示的控制器中设置代码
在detailviewcontroller中需要返回出pop向上拉的选项。(也可以不实现)另外要为了要展示出数据,我在该视图控制器中添加了一个textview来展示数据。
1 | self.title = "详情" |
1 | override var previewActionItems: [UIPreviewActionItem]{ |
返回的数组中存的是UIPreviewAction。这个数组可以是个二维数组,所以可以展示出很多选项。例子中返回的就是一个二维数组。
最后
到此整个效果的代码都设置完了。接下来运行程序,看看我们的成果吧: